// function add1(str){
//     return '1' + str;
// }
//
// function add2(str){
//     return '2' + str;
// }
//
// function add3(str){
//     return '3' + str;
// }

// let result = compose(add1, add2, add3)('ahhh'); //add3('ahhh')执行后的结果作为参数传入add2,add2执行后的结果又作为参数传入add1
// console.log(result); //123ahhh

export default function compose(...funcs: Array<Function>): Function {
  if(funcs.length === 0) return (args: any) => args; //传个'ahhh'返回一个'ahhh'
  if (funcs.length === 1) {
    return funcs[0];
  }
  return funcs.reduce((a: Function, b: Function) => (...args: any[]) => a(b(...args)));

  // return function(...args){
  //     let result;
  //     for(let i=funcs.length-1;i>=0;i--){
  //         let func = funcs[i];
  //         result = func(i == funcs.length - 1 ? args : result);
  //     }
  // }
}
